#ifndef CLIENT_REGISTRAR_HPP
#define CLIENT_REGISTRAR_HPP

#include "Types.hpp"
#include <boost/asio.hpp>
#include <boost/thread/thread.hpp>


namespace netspy
{

/**
 * @brief Obsługuje rejestrację klientów
 *
 * Klasa obsługuje połączenia przychodzące - rejestrację klientów (w osobnych wątkach). Zaimplementowana jako singlegon.
 *
*/

class ClientRegistrar
{
	public:
		static ClientRegistrar &getInstance()
		{
			static ClientRegistrar registrar;
			return registrar; 

		}

		/**
		 * 
		 *   Ustawia numer portu na którym serwer ma oczekiwać na rejestrację
		 *
		*/
		void setPort(const uint16_t &portNumber);

		bool run();
	
	
	private:
		ClientRegistrar():isRunning_(false),portNumber_(0) {}
       		ClientRegistrar(const ClientRegistrar &);
       		ClientRegistrar& operator=(const ClientRegistrar&);
   	        
 		/**
                 *   Nasłuchuje na połaczenie
                */
		void registerProcess();

		/// Funkcja obsługująca sesję komunikacji, działa w osobnym wątku, odpalana w momencie przyjęcia połączenia
		void registerSession(socket_ptr sock);
	
		bool isRunning_;
		boost::asio::io_service registerService_;
		uint16_t portNumber_;
		boost::thread	registerThread_;	
};

}
#endif
